#! /usr/bin/env python3

# Create By GF 2023-07-12 15:04

# Py3_Demo_日期时间(datetime)_Explain_GF_2023-07-12.py

# ----------------------------------------------------------------------------------------------------

from datetime import date
from datetime import datetime
from datetime import time
from datetime import timedelta
from datetime import tzinfo

# ----------------------------------------------------------------------------------------------------
# datetime 模块的类

# 定义了5个类，分别是

# 1.datetime.date      : 表示日期的类，常用的属性有 year, month, day。

# 2.datetime.datetime  : 表示日期时间的类，常用的属性有 hour, minute, second, microsecond。

# 3.datetime.time      : 表示时间的类。

# 4.datetime.timedelta : 表示时间间隔，即两个时间点的间隔。在日期上做天 days，小时 hour，分钟，秒，毫秒，微妙的时间计算。

# 5.datetime.tzinfo    : 时区的相关信息。

# ----------------------------------------------------------------------------------------------------
# 1. date 类

    # (1) 静态方法：
    
        class datetime.date(year, month, day)
        
        datetime.MINYEAR=1
        
        datetime.MAXYEAR=9999
        
        # 返回一个表示当前本地日期的 date 对象。
        date.today()
        
        # 根据给定的时间戮，返回一个 date 对象。
        date.fromtimestamp(timestamp)
    
    # (2) 方法、属性：
    
        # 返回年。
        date.year
        
        # 返回月。
        date.month
        
        # 返回日。
        date.day
        
        # 生成一个新的日期对象，用参数指定的年，月，日代替原有对象中的属性。（原有对象仍保持不变）。
        date.replace(year, month, day)
        
        # 返回日期对应的 time.struct_time 对象即一个元组。
        date.timetuple()
        
        # 返回日期对应的 Gregorian Calendar 日期。
        date.toordinal()
        
        # 返回 weekday，如果是星期一，返回0；如果是星期2，返回1，以此类推。
        date.weekday()
        
        # 返回 weekday，如果是星期一，返回1；如果是星期2，返回2，以此类推。
        data.isoweekday()
        
        # 返回格式如 (year，month，day) 的元组。
        date.isocalendar()
        
        # 返回格式如 'YYYY-MM-DD’ 的字符串。
        date.isoformat()
        
        # 自定义格式化字符串。
        date.strftime(fmt)

# ----------------------------------------------------------------------------------------------------
# 2. Time 类

    # 返回时。
    time.hour
    
    # 返回分。
    time.minute
    
    # 返回秒。
    time.second
    
    # 返回微秒。
    time.microsecond
    
    # 返回时区信息
    time.tzinfo
    
    # 创建一个新的时间对象，用参数指定的时、分、秒、微秒代替原有对象中的属性（原有对象仍保持不变）。
    time.replace([ hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] )
    
    # 返回型如 "HH:MM:SS" 格式的字符串表示。
    time.isoformat()
    
    # 返回自定义格式化字符串。
    time.strftime(fmt)

# ----------------------------------------------------------------------------------------------------
# 3. datetime 类

    # (1) 静态方法：
    
        # datetime 所能表示的最小值。
        datetime.min
        
        # datetime 所能表示的最大值。
        datetime.max
        
        # datetime 最小单位。
        datetime.resolution
        
        # 返回一个表示当前本地时间的 datetime 对象。
        datetime.today()
        
        # 返回一个表示当前本地时间的 datetime 对象，如果提供了参数 tz，则获取 tz 参数所指时区的本地时间。
        datetime.now([tz])
        
        # 返回一个当前 utc 时间的 datetime 对象。
        datetime.utcnow()
        
        # 根据时间戮创建一个 datetime 对象，参数 tz 指定时区信息。
        datetime.fromtimestamp(timestamp[, tz])
        
        # 根据时间戮创建一个 datetime 对象
        datetime.utcfromtimestamp(timestamp)
        
        # 根据 date 和 time，创建一个 datetime 对象
        datetime.combine(date, time)
        
        # 将格式字符串转换为datetime对象。
        datetime.strptime(date_string, format)
    
    # (2) 方法、属性：
    
        # 返回年。
        datetime.year
        
        # 返回月。
        datetime.month
        
        # 返回日。
        datetime.day
        
        # 返回时。
        datetime.hour
        
        # 返回分。
        datetime.minute
        
        # 返回秒。
        datetime.second
        
        # 返回毫秒。
        datetime.microsecond
        
        # 返回时区。
        datetime.tzinfo
        
        # 获取 date 对象。
        datetime.date()
        
        # 获取 time 对象。
        datetime.time()
        
        # 生成一个新的日期时间对象，用参数指定的：年、月、日、时、分、秒、毫秒、时区代替原有对象中的属性。
        datetime.replace ([ year[ , month[ , day[ , hour[ , minute[ , second[ , microsecond[ , tzinfo] ] ] ] ] ] ] ])
        
        # 返回日期对应的 datetime.struct_time 对象即一个元组。
        datetime.timetuple ()
        
        datetime.utctimetuple ()
        
        # 返回日期对应的 Gregorian Calendar 日期时间。
        datetime.toordinal ()
        
        # 返回 weekday，如果是星期一，返回 0，如果是星期 2，返回 1，以此类推。
        datetime.weekday ()
        
        # 返回格式如 (year、month、day、hour、minute、second、microsecond、tzinfo) 的元组。
        datetime.isocalendar ()
        
        datetime.isoformat ([ sep] )
        
        # 返回一个日期时间的 C 格式字符串，等效于 time.ctime(time.mktime(dt.timetuple()))。
        datetime.ctime ()
        
        # 返回自定义格式化字符串。
        datetime.strftime (format)

# ----------------------------------------------------------------------------------------------------
# Time 模块。

# Time 模块包含了以下内置函数，既有时间处理的，也有转换时间格式的。

# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |序号 |函数及描述                                                                                                                |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |1    |time.altzone                                                                                                              |
# |     |返回格林威治西部的夏令时地区的偏移秒数。如果该地区在格林威治东部会返回负值（如西欧，包括英国）。对夏令时启用地区才能使用。|
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |2    |time.asctime([tupletime])                                                                                                 |
# |     |接受时间元组并返回一个可读的形式为"Tue Dec 11 18:07:14 2008"（2008年12月11日 周二18时07分14秒）的24个字符的字符串。       |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |3    |time.clock( )                                                                                                             |
# |     |用以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时，比time.time()更有用。                                      |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |4    |time.ctime([secs])                                                                                                        |
# |     |作用相当于asctime(localtime(secs))，未给参数相当于asctime()                                                               |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |5    |time.gmtime([secs])                                                                                                       |
# |     |接收时间戳（1970纪元后经过的浮点秒数）并返回格林威治天文时间下的时间元组t。注：t.tm_isdst始终为0                          |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |6    |time.localtime([secs])                                                                                                    |
# |     |接收时间戳（1970纪元后经过的浮点秒数）并返回当地时间下的时间元组t（t.tm_isdst可取0或1，取决于当地当时是不是夏令时）。     |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |7    |time.mktime(tupletime)                                                                                                    |
# |     |接受时间元组并返回时间戳（1970纪元后经过的浮点秒数）。                                                                    |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |8    |time.sleep(secs)                                                                                                          |
# |     |推迟调用线程的运行，secs指秒数。                                                                                          |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |9    |time.strftime(fmt[,tupletime])                                                                                            |
# |     |接收以时间元组，并返回以可读字符串表示的当地时间，格式由fmt决定。                                                         |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |10   |time.strptime(str,fmt='%a %b %d %H:%M:%S %Y')                                                                             |
# |     |根据fmt的格式把一个时间字符串解析为时间元组。                                                                             |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |11   |time.time( )                                                                                                              |
# |     |返回当前时间的时间戳（1970纪元后经过的浮点秒数）。                                                                        |
# +-----+--------------------------------------------------------------------------------------------------------------------------+
# |12   |time.tzset()                                                                                                              |
# |     |根据环境变量TZ重新初始化时间相关设置。                                                                                    |
# +-----+--------------------------------------------------------------------------------------------------------------------------+

# ----------------------------------------------------------------------------------------------------
# 日历 (Calendar) 模块。

# 此模块的函数都是日历相关的，例如打印某月的字符月历。

# 星期一是默认的每周第一天，星期天是默认的最后一天。更改设置需调用 calendar.setfirstweekday() 函数。模块包含了以下内置函数。

# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |序号 |函数及描述                                                                                                                           |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |1    |calendar.calendar(year,w=2,l=1,c=6)                                                                                                  |
# |     |返回一个多行字符串格式的year年年历，3个月一行，间隔距离为c。 每日宽度间隔为w字符。每行长度为21* W+18+2* C。l是每星期行数。           |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |2    |calendar.firstweekday( )                                                                                                             |
# |     |返回当前每周起始日期的设置。默认情况下，首次载入 calendar 模块时返回 0，即星期一。                                                   |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |3    |calendar.isleap(year)                                                                                                                |
# |     |是闰年返回 True，否则为 False。                                                                                                      |
# |     |                                                                                                                                     |
# |     |1|>>> import calendar                                                                                                                |
# |     |2|>>> print(calendar.isleap(2000))                                                                                                   |
# |     |3|True                                                                                                                               |
# |     |4|>>> print(calendar.isleap(1900))                                                                                                   |
# |     |5|False                                                                                                                              |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |4    |calendar.leapdays(y1,y2)                                                                                                             |
# |     |返回在Y1，Y2两年之间的闰年总数。                                                                                                     |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |5    |calendar.month(year,month,w=2,l=1)                                                                                                   |
# |     |返回一个多行字符串格式的year年month月日历，两行标题，一周一行。每日宽度间隔为w字符。每行的长度为7* w+6。l是每星期的行数。            |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |6    |calendar.monthcalendar(year,month)                                                                                                   |
# |     |返回一个整数的单层嵌套列表。每个子列表装载代表一个星期的整数。Year年month月外的日期都设为0;范围内的日子都由该月第几日表示，从1开始。 |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |7    |calendar.monthrange(year,month)                                                                                                      |
# |     |返回两个整数。第一个是该月的星期几的日期码，第二个是该月的日期码。日从0（星期一）到6（星期日）;月从1到12。                           |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |8    |calendar.prcal(year,w=2,l=1,c=6)                                                                                                     |
# |     |相当于 print calendar.calendar(year,w=2,l=1,c=6)。                                                                                   |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |9    |calendar.prmonth(year,month,w=2,l=1)                                                                                                 |
# |     |相当于 print calendar.month(year,month,w=2,l=1) 。                                                                                   |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |10   |calendar.setfirstweekday(weekday)                                                                                                    |
# |     |设置每周的起始日期码。0（星期一）到6（星期日）。                                                                                     |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |11   |calendar.timegm(tupletime)                                                                                                           |
# |     |和time.gmtime相反：接受一个时间元组形式，返回该时刻的时间戳（1970纪元后经过的浮点秒数）。                                            |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+
# |12   |calendar.weekday(year,month,day)                                                                                                     |
# |     |返回给定日期的日期码。0（星期一）到6（星期日）。月份为 1（一月） 到 12（12月）。                                                     |
# +-----+-------------------------------------------------------------------------------------------------------------------------------------+

# ----------------------------------------------------------------------------------------------------
# Python 中时间日期格式化符号。

# %y 两位数的年份表示（00-99）。

# %Y 四位数的年份表示（000-9999）。

# %m 月份（01-12）。

# %d 月内中的一天（0-31）。

# %H 24小时制小时数（0-23）。

# %I 12小时制小时数（01-12）。

# %M 分钟数（00-59）。

# %S 秒（00-59）。

# %a 本地简化星期名称。

# %A 本地完整星期名称。

# %b 本地简化的月份名称。

# %B 本地完整的月份名称。

# %c 本地相应的日期表示和时间表示。

# %j 年内的一天（001-366）。

# %p 本地A.M.或P.M.的等价符。

# %U 一年中的星期数（00-53）星期天为星期的开始。

# %w 星期（0-6），星期天为星期的开始。

# %W 一年中的星期数（00-53）星期一为星期的开始。

# %x 本地相应的日期表示。

# %X 本地相应的时间表示。

# %Z 当前时区的名称。

# %% %号本身。

# ----------------------------------------------------------------------------------------------------
# EOF
